其他
性能优化技巧:有序定位关联提速主子关联后的过滤
1. 常规有序归并
A | |
1 | =now() |
2 | =file("/home/ctx/orders.ctx").open().cursor@m(O_ORDERKEY,O_ORDERDATE;O_TOTALPRICE>price;4) |
3 | =file("/home/ctx/lineitem.ctx").open().cursor(L_ORDERKEY,L_EXTENDEDPRICE,L_DISCOUNT;;A2) |
4 | =joinx(A3:detail,L_ORDERKEY;A2:orders,O_ORDERKEY) |
5 | =A4.groups(year(orders.O_ORDERDATE):year;sum(detail.L_EXTENDEDPRICE*(1-detail.L_DISCOUNT)):revenue) |
6 | =interval@s(A1,now()) |
A | |
1 | =now() |
2 | =file("/home/ctx/orders.ctx").open().cursor@m(O_ORDERKEY,O_ORDERDATE;O_TOTALPRICE>price;4) |
3 | =file("/home/ctx/lineitem.ctx").open().news(A2,L_ORDERKEY,L_EXTENDEDPRICE,L_DISCOUNT,O_ORDERDATE) |
4 | =A3.groups(year(O_ORDERDATE):year;sum(L_EXTENDEDPRICE*(1-L_DISCOUNT)):revenue) |
5 | =interval@s(A1,now()) |
A3中创建子表游标时没有使用cursor函数,而是使用的news函数,表示在主表游标的基础上,用有序定位归并后生成主子表关联后的游标,所以也不需要再用joinx进行关联了。
3. 测试结果及分析
主表过滤后记录数 | 2亿 | 1.4亿 | 0.9亿 | 0.17亿 |
常规有序归并(秒) | 131 | 115 | 94 | 57 |
有序定位关联(秒) | 105 | 87 | 69 | 35 |
比较两段SPL脚本,主表游标的创建是一样的,在常规有序归并中子表游标是独立创建,会把子表记录中的每条记录所需的3个字段全部读出,然后在joinx的时候再把两个游标的记录进行有序归并。而在有序定位关联中,是根据已经过滤后的主表记录的关联字段值,去子表有序查找所对应的关联字段值。组表数据是分块存储的,组表索引头会记着每块主键的最大最小值,如果发现关联键值大于当前块的最大值,就可以直接跳过这一块,再重新定位到包含这个键值的数据块去读。而且在比对的时候,只需要先读关联字段值,如果值不同而关联不上,则其它2个字段就不用读,值关联了才把其它2个字段读出来。
1. 常规有序归并
A | |
1 | =now() |
2 | =file("/home/ctx/orders.ctx").open().cursor@m(O_ORDERKEY,O_ORDERDATE;;4) |
3 | =file("/home/ctx/lineitem.ctx").open().cursor(L_ORDERKEY,L_EXTENDEDPRICE,L_DISCOUNT;L_QUANTITY>quantity;A2) |
4 | =joinx(A3:detail,L_ORDERKEY;A2:orders,O_ORDERKEY) |
5 | =A4.groups(year(orders.O_ORDERDATE):year; sum(detail.L_EXTENDEDPRICE*(1-detail.L_DISCOUNT)):revenue) |
6 | =interval@s(A1,now()) |
2. 有序定位关联
A | |
1 | =now() |
2 | =file("/home/ctx/lineitem.ctx").open().cursor@m(L_ORDERKEY,L_EXTENDEDPRICE,L_DISCOUNT;L_QUANTITY>quantity;4) |
3 | =file("/home/ctx/orders.ctx").open().new(A2,O_ORDERKEY,O_ORDERDATE,sum(L_EXTENDEDPRICE*(1-L_DISCOUNT)):v) |
4 | =A3.groups(year(O_ORDERDATE):year; sum(v):revenue) |
5 | =interval@s(A1,now()) |
A3中使用new创建主表游标,同时用sum对子表数据按关联键分组求和后作为主表的一个字段值。
3. 测试结果及分析
子表过滤后记录数 | 8.4亿 | 7.2亿 | 3.6亿 | 1.2亿 | 0.5亿 |
常规有序归并(秒) | 127 | 115 | 84 | 57 | 36 |
有序定位关联(秒) | 92 | 87 | 72 | 47 | 31 |
这两段SPL脚本和前面主表过滤的测试差不多,不同的只是使用过滤后的子表来关联主表,需要使用new函数。提速原理也和前面相同,已经过滤后的子表,再与主表关联时,只会读出能关联上的主表记录,不必完全遍历整个主表。从而减少数据读取量。
重磅!开源SPL交流群成立了
简单好用的SPL开源啦!
为了给感兴趣的小伙伴们提供一个相互交流的平台,
特地开通了交流群(群完全免费,不广告不卖课)
需要进群的朋友,可长按扫描下方二维码
本文感兴趣的朋友,请转到阅读原文去收藏 ^_^